﻿using System;
using System.Web;
using SNSGame.Net;

namespace SNSGame.SNSGame.SigningProviders
{
    /// <summary>
    /// 游戏签名帮助
    /// </summary>
    public class SigningHelper
    {

        /// <summary>
        /// 通过基本参数集合与AppSecret生成签名
        /// </summary>
        /// <param name="baseParameters"></param>
        /// <param name="secret"></param>
        /// <returns></returns>
        public static string Generator(HttpParams baseParameters,string secret)
        {
            if (baseParameters == null) throw new ArgumentNullException("baseParameters");

            /* 新浪微游戏加密算法：
     //1.将参数名和参数值进行urlencode,标准:Rfc3986
     //2.将参数拼接成“key=value”格式的键值对，如“p1=v1”、“p2=v2”、“p3=v3”
     //3.将键值对以字典序升序排列后，用&号拼接成base string，如：“p1=v1&p2=v2&p3=v3”
     //4.将base string拼接上应用的Secret Key
     //5.使用SHA1算法生成签名signature，如:sha1(base string.secret key)
      */

            //1.将参数名和参数值进行urlencode,标准:Rfc3986
            var pms = new HttpParams();
            foreach (var parameter in baseParameters)
            {
                pms.Add(new HttpParam(parameter.Name,HttpUtility.UrlEncodeUnicode(parameter.Value)));
            }

            //3.将键值对以字典序升序排列后，用&号拼接成base string，如：“p1=v1&p2=v2&p3=v3”
            pms.Sort(new HttpParamComparer());

            //4.将base string拼接上应用的Secret Key
            var qs = pms + secret;

            //5.使用SHA1算法生成签名signature，如:sha1(base string.secret key)
            return Cryptography.SHA1.Encrypt(qs);
        }

     

    }
}